

package automaton;

import java.util.Set;
import java.util.Iterator;

/**
 * Autómata finito determinístico que acepta o rechaza cadenas de T.
 * 
 * @param <S> tipo de los estados
 * @param <T> tipo de la entrada y las transiciones
 */
public abstract class Automaton<S extends State, T> implements Acceptor<T> {
	
	public boolean accepts(Iterator<T> input) {
		S current = start();
		
		while(input.hasNext() && current != null) {
			T label = input.next();
			current = next(current, label);
		}
		
		return current != null && current.isAcceptor();
	}
	
	/**
	 * Inicializa el reconocimiento de una cadena y
	 * devuelve el estado inicial del autómata.
	 */
	public abstract S start();
	
	/**
	 * Devuelve el estado resultante de tomar la 
	 * transición o null si esto no es posible.
	 */
	public abstract S next(S currentState, T label);
	
}
